package com.tqz.juc.aqs;

import java.util.concurrent.CyclicBarrier;

/**
 * <p>CyclicBarrier与CountDownLaunch的countdown在前，awiat在后的用法的作用一样，
 * 不同的是CyclicBarrier可以循环利用，而CountDownLaunch只能用一次。
 *
 * <p>应用场景：一起去A地点旅游，等到所有人上车之后再发车，所有人在A地点游玩之后又需要去B地点，
 * 那么又需要等待所有人上车之后才能再次发车去B地点。
 *
 * @author tianqingzhao
 * @since 2022/2/5 18:10
 */
public class CyclicBarrierTest {

    public static void main(String[] args) throws Exception {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(11, new Runnable() {

            @Override
            public void run() {
                System.out.println("所有特工到达屏障，准备开始执行秘密任务");
            }
        });

        for (int i = 0; i < 10; i++) {
            new Thread(new Task(cyclicBarrier, i)).start();
        }
        cyclicBarrier.await();
        System.out.println("全部到达屏障....1");

        Thread.sleep(5000);

        for (int i = 0; i < 10; i++) {
            new Thread(new Task(cyclicBarrier, i)).start();
        }
        cyclicBarrier.await();
        System.out.println("全部到达屏障....2");
    }

    static class Task extends Thread {

        private CyclicBarrier cyclicBarrier;

        private int index;

        public Task(CyclicBarrier cyclicBarrier, int index) {
            this.cyclicBarrier = cyclicBarrier;
            this.index = index;
        }

        @Override
        public void run() {
            try {
                System.out.println("index: " + index);
                cyclicBarrier.await();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
